
import axios from "axios";
import {EnvConfig} from "@/utils/index.js";

const CardUtils = {
    /**
     * 华旭读卡器读卡接口
     * @returns {Promise<unknown>}
     */
    huaxuRead: function () {
        console.log('开始读卡信息')
        return new Promise((resolve, reject) => {
            axios.get(EnvConfig.huaxuServerApi).then((res) => {
                console.log('查询读卡信息:', res)
                const data = res.data
                if (data) {
                    const cardNo = data.CardNo || data.cardNo
                    if (CardUtils.isValidCardNo(cardNo)) {
                        resolve(cardNo)
                    } else {
                        reject(cardNo || '读卡失败，请重试。')
                    }
                } else {
                    reject("读卡失败，请重试。")
                    console.error('【华旭】读卡失败，错误信息：', error)
                }
            }, () => {
                reject("读卡失败，请重试。")
                console.error('【华旭】读卡失败，错误信息：', error)
            })
        })
    },
    /**
     * 电子医保卡读卡接口
     * @param cardNo
     * @returns {Promise<unknown>}
     */
    dzybRead: function (cardNo) {
        console.log('开始读取电子医保信息')
        return new Promise((resolve, reject) => {
            axios.get(EnvConfig.dzybServerApi + '?qrcode=' + encodeURIComponent(cardNo)).then((data) => {
                console.log('查询到电子医保信息:', eval(data), eval(data).length)
                data = eval(data)
                if (data?.length) {
                    const dzybData = data[0]
                    const cardNo = dzybData.msg
                    console.log('查询到的电子医保信息：',  dzybData, dzybData.msg)
                    if (CardUtils.isValidCardNo(cardNo)) {
                        resolve(cardNo)
                    } else {
                        reject(cardNo || "电子医保查询失败，请重试。")
                    }
                } else {
                    reject("电子医保查询失败，请重试。")
                }
            }, () => {
                reject("电子医保查询失败，请重试。")
                console.error('【电子医保】读取失败，错误码：', error)
            })
        })
    },
    /**
     * 判断是28位数字的卡号，需要进行多重校验
     * @param cardNo
     * @returns {boolean}
     */
    is28BitCardNumber: function (cardNo) {
        return /^\d{28}$/.test(cardNo)
    },
    /**
     * 判断是电子医保卡匹配规则
     * @param cardNo
     * @returns {boolean}
     */
    isDzybCardNumber: function (cardNo) {
        return /^\d{28}$|https|^SHYB\d{26}$/.test(cardNo)
    },
    /**
     * 判断读卡结果返回的是否是合法的卡号
     * @param cardNo
     * @returns {boolean}
     */
    isValidCardNo: function (cardNo) {
        return /[a-zA-Z0-9_]+$/.test(cardNo)
    },
    /**
     * 根据卡号查询患者信息
     * @param cardNo
     * @param useLike 0 | 1
     * @returns {Promise<unknown>}
     */
    searchPatientByCardNo: function (cardNo, useLike) {
        return new Promise((resolve, reject) => {
            let url = EnvConfig.baseApi + '/patient/register/'+cardNo
            if (useLike && !isNaN(useLike) && useLike === 1) {
                url += '?useLike=1'
            }
            axios.get( url).then((res) => {
                const data = res.data
                if (data && data.code === 200 && data.data?.length) {
                    resolve(data.data)
                } else {
                    reject("卡号[" + cardNo + "]查询信息失败")
                }
            }, () => {
                reject("卡号[" + cardNo + "]查询信息失败")
            })
        })
    },
    // 不包括电子医保卡
    searchPatientWithCardNo: function (cardNo) {
        return new Promise((resolve, reject) => {
            // 如果是28位数字卡号
            if (CardUtils.is28BitCardNumber(cardNo)) {
                // 全字符匹配患者
                CardUtils.searchPatientByCardNo(cardNo).then((res) => {
                    resolve(res)
                }, () => {
                    console.log('28位卡号['+cardNo+']全量匹配查询失败')
                    // 进行前十位匹配
                    const subCardNo = cardNo.substring(0, 10)
                    console.log('截取前十位卡号查询', subCardNo)
                    CardUtils.searchPatientByCardNo(subCardNo).then((res) => {
                        resolve(res)
                    }, (error) => {
                        console.log("卡号["+cardNo+"]读取患者失败:")
                        reject(error)
                    })
                })
            } else {
                // 直接查询患者信息
                console.log("卡号直接查询患者:", cardNo)
                CardUtils.searchPatientByCardNo(cardNo).then((res) => {
                    console.log("卡号["+cardNo+"]读取信息成功")
                    resolve(res)
                }, (error) => {
                    console.log("卡号["+cardNo+"]读取信息失败")
                    reject(error)
                })
            }
        })
    },
    /**
     * 根据卡号去匹配患者， 包括电子医保卡
     * @param cardNo
     * @returns {Promise<unknown>}
     */
    searchCardNo: function (cardNo) {
        return new Promise((resolve, reject) => {
            // 如果是28位数字卡号
            if (CardUtils.is28BitCardNumber(cardNo)) {
                // 全字符匹配患者
                CardUtils.searchPatientByCardNo(cardNo).then((res) => {
                    resolve(res)
                }, () => {
                    console.log('28位卡号['+cardNo+']全量匹配查询失败')
                    // 进行前十位匹配
                    const subCardNo = cardNo.substring(0, 10)
                    console.log('截取前十位卡号查询', subCardNo)
                    CardUtils.searchPatientByCardNo(subCardNo).then((res) => {
                        resolve(res)
                    }, () => {
                        console.log('28位卡号['+cardNo+']前十位卡号匹配查询失败，开始匹配电子医保卡')
                        CardUtils.dzybRead(cardNo).then((_cardNo) => {
                            console.log("电子医保卡读取卡号成功:", _cardNo)
                            CardUtils.searchPatientByCardNo(_cardNo).then((res) => {
                                console.log("电子医保卡["+_cardNo+"]读取信息成功")
                                resolve(res)
                            }, (error) => {
                                console.log("电子医保卡["+_cardNo+"]读取信息失败")
                                reject(error)
                            })
                        }, (error) => {
                            console.log("电子医保卡["+cardNo+"]读取卡号失败:")
                            reject(error)
                        })
                    })
                })
            } else if (CardUtils.isDzybCardNumber(cardNo)){
                console.log('卡号['+cardNo+']匹配电子医保卡开始查询')
                CardUtils.dzybRead(cardNo).then((_cardNo) => {
                    console.log("电子医保卡读取卡号成功:", _cardNo)
                    CardUtils.searchPatientByCardNo(_cardNo).then((res) => {
                        console.log("电子医保卡["+_cardNo+"]读取信息成功")
                        resolve(res)
                    }, (error) => {
                        console.log("电子医保卡["+_cardNo+"]读取信息失败")
                        reject(error)
                    })
                }, (error) => {
                    console.log("电子医保卡["+cardNo+"]读取卡号失败:")
                    reject(error)
                })
            } else {
                // 直接查询患者信息
                console.log("卡号直接查询患者:", cardNo)
                CardUtils.searchPatientByCardNo(cardNo).then((res) => {
                    console.log("卡号["+cardNo+"]读取信息成功")
                    resolve(res)
                }, (error) => {
                    console.log("卡号["+cardNo+"]读取信息失败")
                    reject(error)
                })
            }
        })
    },
    signByCardNo: function (hisId) {
        return new Promise((resolve, reject) => {
            console.log('开始签到，reg id:', hisId)
            axios.post(EnvConfig.baseApi + `/patient/sign/${hisId}`,  null).then(() => {
                if (data && data.code === 200) {
                    resolve(data.data)
                    console.log('挂号ID['+hisId+']签到成功!', data.data)
                } else {
                    reject('挂号ID['+hisId+']签到失败')
                }
            }, () => {
                reject('挂号ID['+hisId+']签到失败')
            })
        })
    }
}

export default CardUtils;